package com.hhf.feicodebackend.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.hhf.feicodebackend.ai.model.enums.CodeGenTypeEnum;
import com.hhf.feicodebackend.common.ErrorCode;
import com.hhf.feicodebackend.constant.AppConstant;
import com.hhf.feicodebackend.exception.BusinessException;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * @Author hhf
 * @Date 2025/8/11
 * @Description
 */
public abstract class CodeFileSaverTemplate<T> {

    /**
     * 文件保存根目录
     */
    protected static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;


    public final File execute(T result, Long appId) {
        //1. 构建路径
        String basePathDir = buildUniqueDir(appId);

        //2. 保存文件
        saveFiles(result, basePathDir);

        //3. 返回结果
        return new File(basePathDir);
    }

    /**
     * 保存文件的具体实现(由子类实现)
     *
     * @param result 保存内容
     * @param path   保存路径
     */
    protected abstract void saveFiles(T result, String path);

    /**
     * 获取代码类型(由子类实现)
     *
     * @return
     */
    protected abstract CodeGenTypeEnum codeGenType();

    /**
     * 代码结果对象校验(可以由子类重写)
     *
     * @param result
     */
    protected void validateInput(T result) {
        if (result == null) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "代码结果对象不能为空");
        }
    }


    /**
     * 构建唯一目录路径：tmp/code_output/bizType_雪花ID
     */
    protected final String buildUniqueDir(Long appId) {
        if (appId == null){
            throw new BusinessException(ErrorCode.PARAMS_ERROR,"应用 ID 不能为空");
        }
        String bizType = codeGenType().getValue();
        String uniqueDirName = StrUtil.format("{}_{}", bizType, appId);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /**
     * 写入单个文件
     */
    protected final void writeToFile(String dirPath, String filename, String content) {
        String filePath = dirPath + File.separator + filename;
        FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
    }
}
